sectors
 [1] "All Industries Total"              "Chemicals"                        
 [3] "Computers and electronic products" "Electrical equipment"             
 [5] "Finance and insurance"             "Food"                             
 [7] "Information"                       "Machinery"                        
 [9] "Mining"                            "Primary and fabricated metals"    
[11] "Professional services"             "Retail Trade"                     
[13] "Total Manufacturing"               "Transportation Equipment"         
[15] "Utilities"                         "Wholesale Trade"                  
glimpse(data)
Rows: 22,470
Columns: 26
$ sector                           <chr> "All Industries Total", "All Industries Total", "All…
$ country                          <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "A…
$ year                             <int> 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007…
$ asset                            <dbl> 38453, 44211, 52398, 60749, 73964, 93415, 109019, 13…
$ compensation_employees           <dbl> 2211, 2332, 2242, 2415, 2745, 3362, 3650, 3994, 4292…
$ employment                       <dbl> 126000, 137200, 139800, 142700, 149800, 154800, 1547…
$ expenditures                     <dbl> 3522, 2765, 4147, 5352, 6793, 8046, 10389, 11172, 11…
$ net_income                       <dbl> 2039, 3981, 2537, 2821, 4740, 7732, 13987, 18154, 21…
$ net_property_plant_and_equipment <dbl> 16140, 16946, 21180, 23297, 29025, 34448, 41078, 478…
$ total_sales                      <dbl> 25539, 34377, 33261, 34070, 40465, 51787, 66438, 791…
$ value_added                      <dbl> 8917, 13785, 12652, 13475, 16861, 22897, 33406, 4233…
$ CI                               <dbl> 16622, 20592, 20609, 20595, 23604, 28890, 33032, 367…
$ Kcca_1                           <dbl> 22313, 27265, 31218, 37452, 44939, 58967, 67941, 836…
$ r                                <dbl> 0.09138171, 0.14601137, 0.08126722, 0.07532308, 0.10…
$ Kcca_2                           <dbl> 181896.4, 141030.1, 253595.5, 273422.2, 223784.8, 22…
$ Kva                              <dbl> 24195.21, 15971.36, 27588.00, 32061.89, 26024.80, 25…
$ TG                               <dbl> 0.032546817, 0.066148952, 0.031718051, 0.030395141, …
$ TGstock                          <dbl> 0.12633209, 0.23492270, 0.11978281, 0.12108855, 0.16…
$ TGasset                          <dbl> 0.05302577, 0.09004546, 0.04841788, 0.04643698, 0.06…
$ PT                               <dbl> 0.07076984, 0.10047376, 0.09050072, 0.09442887, 0.11…
$ Rem                              <dbl> 0.001462302, 0.001416424, 0.001336433, 0.001410301, …
$ COtec                            <dbl> 0.12809524, 0.12351312, 0.15150215, 0.16325858, 0.19…
$ COv                              <dbl> 7.299864, 7.266724, 9.446922, 9.646791, 10.573770, 1…
$ TP                               <dbl> 0.9222071, 1.7071184, 1.1315789, 1.1681159, 1.726776…
$ TPr                              <dbl> 0.084272862, 0.249258689, 0.091960273, 0.087986091, …
$ Continent                        <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", …

Stock de capital invertido

TG


data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total", "Asia and Pacific") ) %>%
  filter( !sector %in% c("Finance without depository", "Finance and insurance") ) %>%
  ggplot(aes(year, TGstock, color = country)) +
  geom_line(size = 0.75, alpha = 0.75)+
  facet_wrap(~sector)+ #scales = "free"
  scale_y_continuous(labels = scales::percent)+
  theme_minimal()+
  labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "Europa y América del Sur")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, size= axis_size),
        axis.text.y = element_text(size= axis_size),
        axis.title  = element_blank() ,
        strip.text = element_text(size=strip_size))+
  scale_color_manual(values=wes_palette(n=4, name="Moonrise2")) #"Royal2"
ggsave("./results/bea/majority_owned_nonbank/tg_eu_sa_all_2.png")
Saving 7.29 x 4.5 in image

data %>%
  filter( Continent %in% c("South America") ) %>%
  filter( !sector %in% c("Finance without depository", 
                         "Finance and insurance",
                         "Professional services",
                         "Wholesale Trade") ) %>%
  ggplot(aes(year, TGstock, color = country)) +
  geom_line()+
  facet_wrap(~sector)+ #scales = "free"
  scale_y_continuous(labels = scales::percent)+
  theme_minimal()+
  labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size = axis_size+6),
        axis.text.x = element_text(angle = 45, size= axis_size+6),
        axis.text.y = element_text(size= axis_size+6),
        axis.title  = element_blank() ,
        strip.text = element_text(size=strip_size+5))+
  scale_color_brewer(palette="Paired")
Warning: Removed 53 rows containing missing values (`geom_line()`).
ggsave("./results/bea/majority_owned_nonbank/tg_sa_2.png", width = 15, height=10)
Warning: Removed 53 rows containing missing values (`geom_line()`).

data %>%
  filter( Continent %in% c("South America") | country %in% c("All Countries Total",
                                                             "European Union") ) %>%
  ggplot(aes(year, TGstock, color = country)) +
  geom_line()+
  facet_wrap(~sector, scales = "free")+
  scale_y_continuous(labels = scales::percent)+
  theme_minimal()+
  labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur, Europa y total paises")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, size= 5),
        axis.text.y = element_text(size= 5),
        axis.title  = element_blank() ,
        strip.text = element_text(size=10))+
  scale_color_brewer(palette="Paired")
ggsave("./results/bea/majority_owned_nonbank/tg_sa_eu_all.png", width = 15, height=10)



data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total") ) %>%
  group_by(country, sector) %>% 
  summarise(TGstock = mean(TGstock, na.rm=T) , 
            PT = mean(PT, na.rm=T)) %>% 
  ggplot(aes(country, TGstock, fill = country)) +
  geom_col(position = "dodge")+
  facet_wrap(~sector, scales = "free")+
  scale_y_continuous(labels = scales::percent_format(accuracy = 1L))+
  theme_minimal()+
  labs(title= "Tasa de ganancia (sin rotación) de inversiones de EEUU", subtitle = "América del Sur, Europa y total países (promedio 1999-2019)")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_text(size= 8),
        axis.title  = element_blank() ,
        strip.text = element_text(size=5))+
  scale_fill_manual(values=wes_palette(n=3, name="Royal2"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/tg_eu_sa_all_avg.png")
Saving 7.29 x 4.5 in image

Productivity (PT)

data_prod <- data %>%
    select(c(sector, country, Continent , year,value_added, employment, PT)) %>%
    filter(PT > 0 &  employment > 0 ) %>%
    arrange(desc(PT)) #    arrange(PT)

glimpse(data_prod)
Rows: 16,857
Columns: 7
$ sector      <chr> "Mining", "Wholesale Trade", "Wholesale Trade", "Wholesale Trade", "Mining", "Wholesale Trade", "Mining"…
$ country     <chr> "Denmark", "Barbados", "Barbados", "Barbados", "Denmark", "United Kingdom Islands, Caribbean", "Denmark"…
$ Continent   <chr> "Europe", "Central America and the Caribbean", "Central America and the Caribbean", "Central America and…
$ year        <int> 2008, 2008, 2006, 2011, 2011, 2007, 2012, 2004, 2010, 2005, 2006, 2010, 2008, 2010, 2003, 2005, 2013, 20…
$ value_added <dbl> 7326, 3032, 2295, 2142, 5671, 1776, 4741, 1556, 4658, 1430, 1372, 2579, 2486, 1237, 1203, 1172, 4615, 22…
$ employment  <dbl> 200, 100, 100, 100, 300, 100, 300, 100, 300, 100, 100, 200, 200, 100, 100, 100, 400, 200, 100, 300, 200,…
$ PT          <dbl> 36.630000, 30.320000, 22.950000, 21.420000, 18.903333, 17.760000, 15.803333, 15.560000, 15.526667, 14.30…
head(data_prod)
top_countries_by_year <- data_prod %>%
  select(-c(Continent , value_added, employment)) %>% 
  group_by(year) %>%
  top_n(3, PT) %>% 
  arrange(-PT)
top_countries_by_year
top_countries_by_year <- data_prod %>%
  select(-c(Continent , value_added, employment)) %>% 
  group_by(year) %>%
  top_n(3, PT) %>% 
  arrange(-PT)
top_countries_by_year
data_prod %>%
  filter( country %in% c("South America", "Europe") ) %>%
  ggplot(aes(year, PT/10e3, fill = country)) +
  geom_col(position = "dodge")+
  facet_wrap(~sector, scales = "free")+
  theme_minimal()+
  labs(title= "Productividad de inversiones de EEUU", subtitle = "Total Europa y América del Sur",
       y = "Miles de USD por obrero")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, size= 5),
        axis.text.y = element_text(size= 5),
        axis.title.x  = element_blank() ,
        axis.title.y  = element_text(size = 3.9) ,
        strip.text = element_text(size=3.9))+
  scale_fill_manual(values=wes_palette(n=3, name="Royal1"))
ggsave(paste0(results_path,"pt_eu_sa.png"))
Saving 7.29 x 4.5 in image
# Iterate through each sector
for (sec in sectors) {
  # Subset the data for the current sector
  sector_data <- data_prod %>%
    filter(sector == sec) 
  
  # Create the plot for the current sector
  plot <- ggplot(sector_data, aes(year, PT/10e3, color = country)) +
    geom_line() +
    facet_wrap(~Continent) + #scales = "free"
    theme_minimal() +
    labs(title = paste("Productividad en", sec, sep = " "),
         subtitle = paste("Total paises por contiente", sec),
         y = "Miles de USD por obrero") +
    theme(legend.position = "none",
          legend.title = element_blank(),
          axis.text.x = element_text(angle = 45, size = 5),
          axis.text.y = element_text(size = 5),
          axis.title.x = element_blank(),
          axis.title.y = element_text(size = 3.9),
          strip.text = element_text(size = 3.9)) 
  print(ggplotly(plot))
  ggsave(filename = paste(results_path, "plot_pt_", sec, ".png", sep = ""),
         plot = plot)
    
  
}
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
`geom_line()`: Each group consists of only one observation.
ℹ Do you need to adjust the group aesthetic?
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image
Saving 7.29 x 4.5 in image

data_prod %>%
  filter( Continent %in% c("South America") ) %>%
  left_join(data %>% 
              filter(country == "Europe") %>% 
              select(year, sector, PTeu=PT) ,
            by = c("year", "sector" )) %>%
  mutate(PTrel = PT/PTeu ) %>% 
  ggplot(aes(year, PTrel, color = country)) +
  geom_line(size = 0.3)+
  facet_wrap(~sector, scales = "free")+
  scale_y_continuous(labels = scales::percent)+
  theme_minimal()+
  labs(title= "Brecha de productividad de inversiones de EEUU", 
       subtitle = "América del Sur relativa a total Europa")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, size= 5),
        axis.text.y = element_text(size= 4),
        axis.title  = element_blank()  ,
        strip.text = element_text(size=5))+
  scale_color_brewer(palette="Paired")
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_relativa.png")
Saving 7.29 x 4.5 in image


## Nivel de productividad (todos los sectores)
data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total") ) %>%
  group_by(country, sector) %>% 
  summarise(TGstock = mean(TGstock, na.rm=T) , 
            PT = mean(PT/10e3, na.rm=T)) %>% 
  ggplot(aes(country, PT, fill = country)) +
  geom_col(position = "dodge")+
  facet_wrap(~sector, scales = "free")+
  theme_minimal()+
  labs(title= "Productividad de inversiones de EEUU", 
       subtitle = "América del Sur, Europa y total países (promedio 1999-2019)",
       y = "Miles de USD por obrero")+
  theme(legend.position = "bottom",
        legend.title = element_blank(),
        axis.text.x = element_blank(),
        axis.text.y = element_text(size= 8),
        axis.title.x  = element_blank() ,
        axis.title.y  = element_text(size = 5) ,
        strip.text = element_text(size=5))+
  scale_fill_manual(values=wes_palette(n=3, name="Moonrise3"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_all_avg.png")
Saving 7.29 x 4.5 in image

## Nivel de productividad (sectores seleccionados)
data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total") &
            sector %in% c("All Industries Total","Mining", "Transportation Equipment", "Total Manufacturing"        )) %>%
  group_by(country, sector) %>% 
  summarise(TGstock = mean(TGstock, na.rm=T) , 
            PT = mean(PT/10e3, na.rm=T)) %>% 
  ggplot(aes(country, PT, fill = country)) +
  geom_col(position = "dodge")+
  facet_wrap(~sector, scales = "free")+
  theme_minimal()+
  labs(title= "Productividad del trabajo de inversiones de EEUU", 
       subtitle = "América del Sur, Europa y total países (promedio 1999-2019)",
       y = "Miles de USD por obrero")+
  theme(plot.title = element_text(size= title_size),
        plot.subtitle = element_text(size= title_size*.8),
        legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size=text_size),
        axis.text.x = element_blank(),
        axis.text.y = element_text(size= text_size),
        axis.title.x  = element_blank() ,
        axis.title.y  = element_text(size = text_size) ,
        strip.text = element_text(size=text_size))+
  scale_fill_manual(values=wes_palette(n=3, name="Moonrise3"))
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
ggsave("./results/bea/majority_owned_nonbank/pt_eu_sa_all_avg_sectors.png", width = 15, height=10)

TG y PT

data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total",
                         "Asia and Pacific", "Central America", "Mexico") ) %>% 
  filter( sector %in% c("All Industries Total","Mining", 
                        "Transportation Equipment", "Total Manufacturing"  ) ) %>% 
  group_by(country, sector) %>% 
  summarise(TGstock = mean(TGstock, na.rm=T) , 
            PT = mean(PT/10e3, na.rm=T)) %>% 
  reshape2::melt() %>% 
  ggplot(aes(x=reorder(variable,-value),y= value, fill = country)) +
  # geom_col(position = "dodge")+
  geom_bar(position = "dodge", stat="identity")+
  facet_wrap(sector~variable,
             # scales = "free",
             ncol=2
             # ,strip.position = c("left", "top")
             # labeller = as_labeller(c(TGstock = "ratio TG", PT = "Miles de USD por obrero") )
             )+
  theme_minimal()+
  labs(title= "Productividad del trabajo y TG de inversiones de EEUU", 
       subtitle = "Promedio 1999-2019", y="Miles de USD por obrero y ratio TG")+
  theme(plot.title = element_text(size= 12),
        plot.subtitle = element_text(size= 12*.8),
        legend.text = element_text(size=7),
        legend.position = "bottom",
        legend.title = element_blank(),
        axis.title.x = element_blank(),
        axis.title.y = element_text(size= 10),
        axis.text.y = element_text(size= 7),
        axis.text.x = element_blank(),
        strip.text = element_text(size=10),
        strip.placement = "outside" )+
  scale_fill_brewer(palette="Paired")
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
Using country, sector as id variables

Salario



data %>%
  filter( country %in% c("South America", "European Union", "All Countries Total",
                         "Asia and Pacific", "Central America", "Mexico") ) %>% 
  filter( sector %in% c("All Industries Total","Mining", 
                        "Transportation Equipment", "Total Manufacturing"  ) ) %>% 
  group_by(country, sector) %>% 
  summarise(Rem = mean(Rem*10e6, na.rm=T) ) %>% 
  reshape2::melt() %>% 
  ggplot(aes(x=reorder(variable,-value),y= value, fill = country)) +
  # geom_col(position = "dodge")+
  geom_bar(position = "dodge", stat="identity")+
  facet_wrap(~sector, scales = "free", ncol=2)+
  theme_minimal()+
  labs(title= "Salario promedio en las inversiones de EEUU", 
       subtitle = "Promedio 1999-2019", y="USD")+
  theme(plot.title = element_text(size=title_size),
        plot.subtitle  = element_text(size=title_size*.8),
        legend.position = "bottom",
        legend.title = element_blank(),
        legend.text = element_text(size=text_size),
        axis.title.x = element_blank(),
        axis.title.y = element_text(size= text_size),
        axis.text.y = element_text(size= text_size),
        axis.text.x = element_blank(),
        strip.text = element_text(size=text_size))+
  scale_fill_brewer(palette="Paired")
`summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
Using country, sector as id variables
ggsave("./results/bea/majority_owned_nonbank/salario_avg_sectors.png", width = 15, height = 10)

LS0tDQp0aXRsZTogIk1ham9yaXR5IG93bmVkIEVEQSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHdlc2FuZGVyc29uKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIgKQ0KDQojIHNldHdkKCJDOi9BcmNoaXZvcy9kYXRvcy9iZWEvY29kaWdvcy9tYWpvcml0eV9vd25lZC8iKQ0KIyBzZXR3ZCgiQzovRG9jdW1lbnRzL2RhdGEvYmVhL2NvZGlnb3MvbWFqb3JpdHlfb3duZWQvIikNCg0KcmVzdWx0c19wYXRoID0gJy4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay8nDQoNCiNwYXJhbXMNCnRpdGxlX3NpemU9NDANCnRleHRfc2l6ZT0gMzANCmF4aXNfc2l6ZT0gNQ0Kc3RyaXBfc2l6ZT0gNg0KDQpkYXRhIDwtIHJlYWQuY3N2KCAiLi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay9kYXRhX21ham9yaXR5X293bmVkX25vbmJhbmsuY3N2IikgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJPdGhlciBJbmR1c3RyaWVzIikgJT4lIA0KICBtdXRhdGUoc2VjdG9yID0gY2FzZV93aGVuKHNlY3RvciA9PSAiRWxlY3RyaWNhbCBlcXVpcG1lbnQsIGFwcGxpYW5jZXMsIGFuZCBjb21wb25lbnRzIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWxlY3RyaWNhbCBlcXVpcG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciA9PSAiRmluYW5jZSAoZXhjZXB0IGRlcG9zaXRvcnkgaW5zdGl0dXRpb25zKSBhbmQgaW5zdXJhbmNlIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmluYW5jZSBhbmQgaW5zdXJhbmNlIiwgIyAiRmluYW5jZSB3aXRob3V0IGRlcG9zaXRvcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3RvciA9PSAiUHJvZmVzc2lvbmFsLCBzY2llbnRpZmljLCBhbmQgdGVjaG5pY2FsIHNlcnZpY2VzIiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9mZXNzaW9uYWwgc2VydmljZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHNlY3RvciApKQ0KDQojIENyZWF0ZSBhIHZlY3RvciBvZiB1bmlxdWUgc2VjdG9ycw0Kc2VjdG9ycyA8LSB1bmlxdWUoZGF0YSRzZWN0b3IpDQpzZWN0b3JzDQpgYGANCg0KYGBge3J9DQpnbGltcHNlKGRhdGEpDQpgYGANCg0KDQojIFN0b2NrIGRlIGNhcGl0YWwgaW52ZXJ0aWRvDQpgYGB7cn0NCg0KYGBgDQoNCg0KIyBURw0KYGBge3J9DQoNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIsICJBc2lhIGFuZCBQYWNpZmljIikgKSAlPiUNCiAgZmlsdGVyKCAhc2VjdG9yICVpbiUgYygiRmluYW5jZSB3aXRob3V0IGRlcG9zaXRvcnkiLCAiRmluYW5jZSBhbmQgaW5zdXJhbmNlIikgKSAlPiUNCiAgZ2dwbG90KGFlcyh5ZWFyLCBUR3N0b2NrLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fbGluZShzaXplID0gMC43NSwgYWxwaGEgPSAwLjc1KSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKSsgI3NjYWxlcyA9ICJmcmVlIg0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkV1cm9wYSB5IEFtw6lyaWNhIGRlbCBTdXIiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gYXhpc19zaXplKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0gYXhpc19zaXplKSwNCiAgICAgICAgYXhpcy50aXRsZSAgPSBlbGVtZW50X2JsYW5rKCkgLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9c3RyaXBfc2l6ZSkpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49NCwgbmFtZT0iTW9vbnJpc2UyIikpICMiUm95YWwyIg0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfZXVfc2FfYWxsXzIucG5nIikNCg0KDQoNCmRhdGEgJT4lDQogIGZpbHRlciggQ29udGluZW50ICVpbiUgYygiU291dGggQW1lcmljYSIpICkgJT4lDQogIGZpbHRlciggIXNlY3RvciAlaW4lIGMoIkZpbmFuY2Ugd2l0aG91dCBkZXBvc2l0b3J5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIkZpbmFuY2UgYW5kIGluc3VyYW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Zlc3Npb25hbCBzZXJ2aWNlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIldob2xlc2FsZSBUcmFkZSIpICkgJT4lDQogIGdncGxvdChhZXMoeWVhciwgVEdzdG9jaywgY29sb3IgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2xpbmUoKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yKSsgI3NjYWxlcyA9ICJmcmVlIg0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXNfc2l6ZSs2KSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gYXhpc19zaXplKzYpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSBheGlzX3NpemUrNiksDQogICAgICAgIGF4aXMudGl0bGUgID0gZWxlbWVudF9ibGFuaygpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXN0cmlwX3NpemUrNSkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3NhXzIucG5nIiwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwKQ0KDQpkYXRhICU+JQ0KICBmaWx0ZXIoIENvbnRpbmVudCAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiKSB8IGNvdW50cnkgJWluJSBjKCJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXVyb3BlYW4gVW5pb24iKSApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIFRHc3RvY2ssIGNvbG9yID0gY291bnRyeSkpICsNCiAgZ2VvbV9saW5lKCkrDQogIGZhY2V0X3dyYXAofnNlY3Rvciwgc2NhbGVzID0gImZyZWUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlRhc2EgZGUgZ2FuYW5jaWEgKHNpbiByb3RhY2nDs24pIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYWlzZXMiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDUpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3NhX2V1X2FsbC5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTApDQoNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIikgKSAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSwgc2VjdG9yKSAlPiUgDQogIHN1bW1hcmlzZShUR3N0b2NrID0gbWVhbihUR3N0b2NrLCBuYS5ybT1UKSAsIA0KICAgICAgICAgICAgUFQgPSBtZWFuKFBULCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFRHc3RvY2ssIGZpbGwgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IsIHNjYWxlcyA9ICJmcmVlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiVGFzYSBkZSBnYW5hbmNpYSAoc2luIHJvdGFjacOzbikgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIsIEV1cm9wYSB5IHRvdGFsIHBhw61zZXMgKHByb21lZGlvIDE5OTktMjAxOSkiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDgpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT01KSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz13ZXNfcGFsZXR0ZShuPTMsIG5hbWU9IlJveWFsMiIpKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfZXVfc2FfYWxsX2F2Zy5wbmciKQ0KDQpgYGANCg0KIyBQcm9kdWN0aXZpdHkgKFBUKQ0KYGBge3J9DQpkYXRhX3Byb2QgPC0gZGF0YSAlPiUNCiAgICBzZWxlY3QoYyhzZWN0b3IsIGNvdW50cnksIENvbnRpbmVudCAsIHllYXIsdmFsdWVfYWRkZWQsIGVtcGxveW1lbnQsIFBUKSkgJT4lDQogICAgZmlsdGVyKFBUID4gMCAmICBlbXBsb3ltZW50ID4gMCApICU+JQ0KICAgIGFycmFuZ2UoZGVzYyhQVCkpICMgICAgYXJyYW5nZShQVCkNCg0KZ2xpbXBzZShkYXRhX3Byb2QpDQpoZWFkKGRhdGFfcHJvZCkNCmBgYA0KDQpgYGB7cn0NCnRvcF9jb3VudHJpZXNfYnlfeWVhciA8LSBkYXRhX3Byb2QgJT4lDQogIHNlbGVjdCgtYyhDb250aW5lbnQgLCB2YWx1ZV9hZGRlZCwgZW1wbG95bWVudCkpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRvcF9uKDMsIFBUKSAlPiUgDQogIGFycmFuZ2UoLVBUKQ0KdG9wX2NvdW50cmllc19ieV95ZWFyDQpgYGANCg0KDQpgYGB7cn0NCnRvcF9jb3VudHJpZXNfYnlfeWVhciA8LSBkYXRhX3Byb2QgJT4lDQogIHNlbGVjdCgtYyhDb250aW5lbnQgLCB2YWx1ZV9hZGRlZCwgZW1wbG95bWVudCkpICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lDQogIHRvcF9uKDMsIFBUKSAlPiUgDQogIGFycmFuZ2UoLVBUKQ0KdG9wX2NvdW50cmllc19ieV95ZWFyDQpgYGANCg0KDQpgYGB7cn0NCmRhdGFfcHJvZCAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGUiKSApICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsIFBULzEwZTMsIGZpbGwgPSBjb3VudHJ5KSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBmYWNldF93cmFwKH5zZWN0b3IsIHNjYWxlcyA9ICJmcmVlIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlByb2R1Y3RpdmlkYWQgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIHN1YnRpdGxlID0gIlRvdGFsIEV1cm9wYSB5IEFtw6lyaWNhIGRlbCBTdXIiLA0KICAgICAgIHkgPSAiTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8iKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDUpLA0KICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF9ibGFuaygpICwNCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplID0gMy45KSAsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0zLjkpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49MywgbmFtZT0iUm95YWwxIikpDQpnZ3NhdmUocGFzdGUwKHJlc3VsdHNfcGF0aCwicHRfZXVfc2EucG5nIikpDQoNCg0KIyBJdGVyYXRlIHRocm91Z2ggZWFjaCBzZWN0b3INCmZvciAoc2VjIGluIHNlY3RvcnMpIHsNCiAgIyBTdWJzZXQgdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IHNlY3Rvcg0KICBzZWN0b3JfZGF0YSA8LSBkYXRhX3Byb2QgJT4lDQogICAgZmlsdGVyKHNlY3RvciA9PSBzZWMpIA0KICANCiAgIyBDcmVhdGUgdGhlIHBsb3QgZm9yIHRoZSBjdXJyZW50IHNlY3Rvcg0KICBwbG90IDwtIGdncGxvdChzZWN0b3JfZGF0YSwgYWVzKHllYXIsIFBULzEwZTMsIGNvbG9yID0gY291bnRyeSkpICsNCiAgICBnZW9tX2xpbmUoKSArDQogICAgZmFjZXRfd3JhcCh+Q29udGluZW50KSArICNzY2FsZXMgPSAiZnJlZSINCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiUHJvZHVjdGl2aWRhZCBlbiIsIHNlYywgc2VwID0gIiAiKSwNCiAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoIlRvdGFsIHBhaXNlcyBwb3IgY29udGllbnRlIiwgc2VjKSwNCiAgICAgICAgIHkgPSAiTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8iKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBzaXplID0gNSksDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDMuOSksDQogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMy45KSkgDQogIHByaW50KGdncGxvdGx5KHBsb3QpKQ0KICBnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZShyZXN1bHRzX3BhdGgsICJwbG90X3B0XyIsIHNlYywgIi5wbmciLCBzZXAgPSAiIiksDQogICAgICAgICBwbG90ID0gcGxvdCkNCiAgICANCiAgDQp9DQoNCg0KZGF0YV9wcm9kICU+JQ0KICBmaWx0ZXIoIENvbnRpbmVudCAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiKSApICU+JQ0KICBsZWZ0X2pvaW4oZGF0YSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihjb3VudHJ5ID09ICJFdXJvcGUiKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCh5ZWFyLCBzZWN0b3IsIFBUZXU9UFQpICwNCiAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJzZWN0b3IiICkpICU+JQ0KICBtdXRhdGUoUFRyZWwgPSBQVC9QVGV1ICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXIsIFBUcmVsLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fbGluZShzaXplID0gMC4zKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSAiQnJlY2hhIGRlIHByb2R1Y3RpdmlkYWQgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIgcmVsYXRpdmEgYSB0b3RhbCBFdXJvcGEiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgc2l6ZT0gNSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDQpLA0KICAgICAgICBheGlzLnRpdGxlICA9IGVsZW1lbnRfYmxhbmsoKSAgLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9NSkpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3B0X2V1X3NhX3JlbGF0aXZhLnBuZyIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCiMjIE5pdmVsIGRlIHByb2R1Y3RpdmlkYWQgKHRvZG9zIGxvcyBzZWN0b3JlcykNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIpICkgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoVEdzdG9jayA9IG1lYW4oVEdzdG9jaywgbmEucm09VCkgLCANCiAgICAgICAgICAgIFBUID0gbWVhbihQVC8xMGUzLCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFBULCBmaWxsID0gY291bnRyeSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB5ID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSA4KSwNCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfYmxhbmsoKSAsDQogICAgICAgIGF4aXMudGl0bGUueSAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTUpKSsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdlc19wYWxldHRlKG49MywgbmFtZT0iTW9vbnJpc2UzIikpDQpnZ3NhdmUoIi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay9wdF9ldV9zYV9hbGxfYXZnLnBuZyIpDQoNCg0KIyMgTml2ZWwgZGUgcHJvZHVjdGl2aWRhZCAoc2VjdG9yZXMgc2VsZWNjaW9uYWRvcykNCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIpICYNCiAgICAgICAgICAgIHNlY3RvciAlaW4lIGMoIkFsbCBJbmR1c3RyaWVzIFRvdGFsIiwiTWluaW5nIiwgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgICAgICAgKSkgJT4lDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoVEdzdG9jayA9IG1lYW4oVEdzdG9jaywgbmEucm09VCkgLCANCiAgICAgICAgICAgIFBUID0gbWVhbihQVC8xMGUzLCBuYS5ybT1UKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGNvdW50cnksIFBULCBmaWxsID0gY291bnRyeSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZSIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB5ID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gdGl0bGVfc2l6ZSksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0gdGl0bGVfc2l6ZSouOCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9dGV4dF9zaXplKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IHRleHRfc2l6ZSksDQogICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X2JsYW5rKCkgLA0KICAgICAgICBheGlzLnRpdGxlLnkgID0gZWxlbWVudF90ZXh0KHNpemUgPSB0ZXh0X3NpemUpICwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSkpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj0zLCBuYW1lPSJNb29ucmlzZTMiKSkNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3B0X2V1X3NhX2FsbF9hdmdfc2VjdG9ycy5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTApDQoNCmBgYA0KDQojIyBURyB5IFBUDQpgYGB7cn0NCmRhdGEgJT4lDQogIGZpbHRlciggY291bnRyeSAlaW4lIGMoIlNvdXRoIEFtZXJpY2EiLCAiRXVyb3BlYW4gVW5pb24iLCAiQWxsIENvdW50cmllcyBUb3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIkFzaWEgYW5kIFBhY2lmaWMiLCAiQ2VudHJhbCBBbWVyaWNhIiwgIk1leGljbyIpICkgJT4lIA0KICBmaWx0ZXIoIHNlY3RvciAlaW4lIGMoIkFsbCBJbmR1c3RyaWVzIFRvdGFsIiwiTWluaW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAiVHJhbnNwb3J0YXRpb24gRXF1aXBtZW50IiwgIlRvdGFsIE1hbnVmYWN0dXJpbmciICApICkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5LCBzZWN0b3IpICU+JSANCiAgc3VtbWFyaXNlKFRHc3RvY2sgPSBtZWFuKFRHc3RvY2ssIG5hLnJtPVQpICwgDQogICAgICAgICAgICBQVCA9IG1lYW4oUFQvMTBlMywgbmEucm09VCkpICU+JSANCiAgcmVzaGFwZTI6Om1lbHQoKSAlPiUgDQogIGdncGxvdChhZXMoeD1yZW9yZGVyKHZhcmlhYmxlLC12YWx1ZSkseT0gdmFsdWUsIGZpbGwgPSBjb3VudHJ5KSkgKw0KICAjIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSsNCiAgZmFjZXRfd3JhcChzZWN0b3J+dmFyaWFibGUsDQogICAgICAgICAgICAgc2NhbGVzPSAiZnJlZSIsDQogICAgICAgICAgICAgbmNvbD0yDQogICAgICAgICAgICAgIyAsc3RyaXAucG9zaXRpb24gPSBjKCJsZWZ0IiwgInRvcCIpDQogICAgICAgICAgICAgIyBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGMoVEdzdG9jayA9ICJyYXRpbyBURyIsIFBUID0gIk1pbGVzIGRlIFVTRCBwb3Igb2JyZXJvIikgKQ0KICAgICAgICAgICAgICkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0gIlByb2R1Y3RpdmlkYWQgZGVsIHRyYWJham8geSBURyBkZSBpbnZlcnNpb25lcyBkZSBFRVVVIiwgDQogICAgICAgc3VidGl0bGUgPSAiUHJvbWVkaW8gMTk5OS0yMDE5IiwgeT0iTWlsZXMgZGUgVVNEIHBvciBvYnJlcm8geSByYXRpbyBURyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IDEyKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPSAxMiouOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9NyksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9IDEwKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0gNyksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICBzdHJpcC5wbGFjZW1lbnQgPSAib3V0c2lkZSIgKSsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iUGFpcmVkIikNCmdnc2F2ZSgiLi9yZXN1bHRzL2JlYS9tYWpvcml0eV9vd25lZF9ub25iYW5rL3RnX3lfcHRfZXVfc2FfYWxsX2F2Z19zZWN0b3JzX21vcmVfY291bnRyaWVzLnBuZyIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1KQ0KDQpkYXRhICU+JQ0KICBmaWx0ZXIoIGNvdW50cnkgJWluJSBjKCJTb3V0aCBBbWVyaWNhIiwgIkV1cm9wZWFuIFVuaW9uIiwgIkFsbCBDb3VudHJpZXMgVG90YWwiKSApICU+JQ0KICAjIGZpbHRlciggc2VjdG9yICVpbiUgYygiQWxsIEluZHVzdHJpZXMgVG90YWwiLCJNaW5pbmciLCANCiAgIyAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgKSApICU+JSANCiAgZ2dwbG90KGFlcyhQVC8xMGUzLCBUR3N0b2NrLCBjb2xvciA9IGNvdW50cnkpKSArDQogIGdlb21fcG9pbnQoKSsNCiAgZmFjZXRfd3JhcCh+c2VjdG9yLCBzY2FsZXMgPSAiZnJlZV95IikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xTCkpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIHkgVEcgZGUgaW52ZXJzaW9uZXMgZGUgRUVVVSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkFtw6lyaWNhIGRlbCBTdXIsIEV1cm9wYSB5IHRvdGFsIHBhw61zZXMiLA0KICAgICAgIHg9IlByb2R1Y3RpdmlkYWQgZGVsIHRyYWJham8iLCB5PSAiVGFzYSBkZSBnYW5hbmNpYSIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjUqLjgpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPSAxNCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9IDE0KSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9d2VzX3BhbGV0dGUobj0zLCBuYW1lPSJHcmFuZEJ1ZGFwZXN0MSIpKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvdGdfeV9wdF9ldV9zYV9hbGxfc2NhdHRlci5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMCkNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXNpYSBhbmQgUGFjaWZpYyIsICJDZW50cmFsIEFtZXJpY2EiLCAiTWV4aWNvIg0KICAgICAgICAgICAgICAgICAgICAgICAgICkgKSAlPiUNCiAgZmlsdGVyKCBzZWN0b3IgJWluJSBjKCJBbGwgSW5kdXN0cmllcyBUb3RhbCIsIyJNaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcG9ydGF0aW9uIEVxdWlwbWVudCIsICJUb3RhbCBNYW51ZmFjdHVyaW5nIiAgKSApICU+JQ0KICBncm91cF9ieShjb3VudHJ5LCBzZWN0b3IpICU+JSANCiAgc3VtbWFyaXNlKFRHc3RvY2sgPSBtZWFuKFRHc3RvY2ssIG5hLnJtPVQpICwgDQogICAgICAgICAgICBQVCA9IG1lYW4oUFQvMTBlMywgbmEucm09VCkpICU+JSANCiAgZ2dwbG90KGFlcyhQVCwgVEdzdG9jaywgY29sb3IgPSBjb3VudHJ5KSkgKw0KICBnZW9tX3BvaW50KHNpemU9NykrDQogIGZhY2V0X3dyYXAofnNlY3Rvcg0KICAgICAgICAgICAgICMgLCBzY2FsZXMgPSAiZnJlZV95Ig0KICAgICAgICAgICAgICkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xTCkpKw0KICB0aGVtZV9saW5lZHJhdygpKw0KICBsYWJzKHRpdGxlPSAiUHJvZHVjdGl2aWRhZCB5IFRHIGRlIGludmVyc2lvbmVzIGRlIEVFVVUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJBbcOpcmljYSBkZWwgU3VyLCBFdXJvcGEgeSB0b3RhbCBwYcOtc2VzIChwcm9tZWRpbyAxOTk5LTIwMTkpIiwNCiAgICAgICB4PSJQcm9kdWN0aXZpZGFkIGRlbCB0cmFiYWpvIChtaWxlcyBkZSBVU0QgcG9yIG9icmVybykiLCB5PSAiVGFzYSBkZSBnYW5hbmNpYSIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9IHRpdGxlX3NpemUqLjgpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9dGV4dF9zaXplLTUpKSsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlBhaXJlZCIpDQpnZ3NhdmUoIi4vcmVzdWx0cy9iZWEvbWFqb3JpdHlfb3duZWRfbm9uYmFuay90Z195X3B0X2V1X3NhX2FsbF9hdmdfc2NhdHRlcl9zZWxlY3RlZF9jb3VudHJpZXMucG5nIiwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gMTApDQoNCmBgYA0KDQoNCiMgU2FsYXJpbw0KYGBge3J9DQoNCg0KZGF0YSAlPiUNCiAgZmlsdGVyKCBjb3VudHJ5ICVpbiUgYygiU291dGggQW1lcmljYSIsICJFdXJvcGVhbiBVbmlvbiIsICJBbGwgQ291bnRyaWVzIFRvdGFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXNpYSBhbmQgUGFjaWZpYyIsICJDZW50cmFsIEFtZXJpY2EiLCAiTWV4aWNvIikgKSAlPiUgDQogIGZpbHRlciggc2VjdG9yICVpbiUgYygiQWxsIEluZHVzdHJpZXMgVG90YWwiLCJNaW5pbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICJUcmFuc3BvcnRhdGlvbiBFcXVpcG1lbnQiLCAiVG90YWwgTWFudWZhY3R1cmluZyIgICkgKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHNlY3RvcikgJT4lIA0KICBzdW1tYXJpc2UoUmVtID0gbWVhbihSZW0qMTBlNiwgbmEucm09VCkgKSAlPiUgDQogIHJlc2hhcGUyOjptZWx0KCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9cmVvcmRlcih2YXJpYWJsZSwtdmFsdWUpLHk9IHZhbHVlLCBmaWxsID0gY291bnRyeSkpICsNCiAgIyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikrDQogIGZhY2V0X3dyYXAofnNlY3Rvciwgc2NhbGVzID0gImZyZWUiLCBuY29sPTIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9ICJTYWxhcmlvIHByb21lZGlvIGVuIGxhcyBpbnZlcnNpb25lcyBkZSBFRVVVIiwgDQogICAgICAgc3VidGl0bGUgPSAiUHJvbWVkaW8gMTk5OS0yMDE5IiwgeT0iVVNEIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT10aXRsZV9zaXplKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSAgPSBlbGVtZW50X3RleHQoc2l6ZT10aXRsZV9zaXplKi44KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT10ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplPSB0ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPSB0ZXh0X3NpemUpLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPXRleHRfc2l6ZSkpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJQYWlyZWQiKQ0KZ2dzYXZlKCIuL3Jlc3VsdHMvYmVhL21ham9yaXR5X293bmVkX25vbmJhbmsvc2FsYXJpb19hdmdfc2VjdG9ycy5wbmciLCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMCkNCg0KYGBgDQoNCg==